package formulation;

import java.util.ArrayList;

import es.deusto.ingenieria.is.search.formulation.State;

public class Environment extends State implements Cloneable 
{
	private ArrayList<Soporte> soportes = new ArrayList<Soporte>();

	private int soporteInicial;
	private int soporteFinal;
	private int numDiscos;

	public Environment()
	{
		
	}

	public Environment(int numSoportes, int numDiscos , int soporteDiscos)
    {
		this.numDiscos = numDiscos;
		
    	Soporte soporte = null;
    	
    	for (int i = 0; i < numSoportes; i++)
		{
    		soporte = new Soporte(i + 1);
    		
    		if ((i + 1) == soporteDiscos)
    		{
    			soporte.cargarDiscosSoporte(numDiscos);
    		}
    		
    		soportes.add(soporte);
		}
    }
	
	@Override 
	public String toString()
	{
		String cadena = "";
		
		for (Soporte soporte : soportes)
		{
			cadena = cadena + soporte.toString();
		}
		
		return cadena;
	}

	@Override
	public boolean equals(Object obj)
	{
		boolean iguales = false;
		
		if (obj != null && obj instanceof Environment)
		{
			Environment environment = (Environment) obj;
			ArrayList<Soporte> soportes = environment.getSoportes();
			
			if (soportes.size() == this.soportes.size())
			{
				iguales = true;
				int i = 0;
				
				while ((iguales == true) && (i < soportes.size()))
				{
					if (!soportes.get(i).equals(this.soportes.get(i)))
					{
						iguales = false;
					}
					i++;
				}
			}
		}
		
		return iguales;
	}

	@Override
	public Object clone()
	{
		Environment clon = new Environment();
		
		clon.setSoporteInicial(this.soporteInicial);
		clon.setSoporteFinal(this.soporteFinal);
		clon.setNumDiscos(this.numDiscos);
		
		try 
		{
			for (Soporte soporte : this.soportes)
			{
				clon.soportes.add((Soporte) soporte.clone());
			}	
		} 
		catch (CloneNotSupportedException e)
		{
			System.err.println("% [ERROR] Environment.clone(): " + e.getMessage());
		}
	
		return clon;
	}
	
    public ArrayList<Soporte> getSoportes()
	{
		return soportes;
	}

	public void setSoportes(ArrayList<Soporte> soportes)
	{
		this.soportes = soportes;
	}
	
	public int getSoporteInicial()
	{
		return soporteInicial;
	}

	public void setSoporteInicial(int soporteInicial)
	{
		this.soporteInicial = soporteInicial;
	}

	public int getSoporteFinal()
	{
		return soporteFinal;
	}

	public void setSoporteFinal(int soporteFinal)
	{
		this.soporteFinal = soporteFinal;
	}
	
	public int getNumDiscos()
	{
		return numDiscos;
	}

	public void setNumDiscos(int numDiscos)
	{
		this.numDiscos = numDiscos;
	}
}